#pragma once

#include "market_data_types.h"
#include <string>
#include <vector>
#include <functional>
#include <memory>

namespace hft {

/**
 * @brief 市场数据接口基类
 * 
 * 这个接口定义了市场数据提供者需要实现的标准方法，
 * 如连接/断开市场、订阅/取消订阅行情、获取市场深度数据等。
 * 不同的市场数据提供者（如CTP、模拟数据等）可以实现这个接口。
 */
class MarketDataInterface {
public:
    // 市场数据回调函数类型
    using DataCallback = std::function<void(const MarketData&)>;
    
    /**
     * @brief 虚析构函数
     */
    virtual ~MarketDataInterface() = default;
    
    /**
     * @brief 连接到市场数据源
     * 
     * @return 连接是否成功
     */
    virtual bool connect() = 0;
    
    /**
     * @brief 断开与市场数据源的连接
     */
    virtual void disconnect() = 0;
    
    /**
     * @brief 订阅特定的市场数据符号
     * 
     * @param symbols 要订阅的符号列表
     * @return 订阅是否成功
     */
    virtual bool subscribe(const std::vector<std::string>& symbols) = 0;
    
    /**
     * @brief 取消订阅特定的市场数据符号
     * 
     * @param symbols 要取消订阅的符号列表
     * @return 取消订阅是否成功
     */
    virtual bool unsubscribe(const std::vector<std::string>& symbols) = 0;
    
    /**
     * @brief 获取市场数据源的名称
     * 
     * @return 市场数据源的名称
     */
    virtual std::string name() const = 0;
    
    /**
     * @brief 设置市场数据回调函数
     * 
     * @param callback 回调函数
     */
    virtual void setDataCallback(DataCallback callback) {
        m_dataCallback = callback;
    }
    
    /**
     * @brief 获取市场深度数据
     * 
     * @param symbol 合约代码
     * @return 市场深度数据
     */
    virtual OrderBook getOrderBook(const std::string& symbol) const {
        // 默认实现返回空的订单簿
        return OrderBook{symbol, {}, {}, std::chrono::system_clock::now()};
    }
    
    /**
     * @brief 获取最新的市场数据
     * 
     * @param symbol 合约代码
     * @return 最新的市场数据
     */
    virtual MarketData getLatestMarketData(const std::string& symbol) const {
        // 默认实现返回空的市场数据
        MarketData data;
        data.symbol = symbol;
        data.timestamp = std::chrono::system_clock::now();
        return data;
    }
    
    /**
     * @brief 是否已连接到市场数据源
     * 
     * @return 是否已连接
     */
    virtual bool isConnected() const {
        return false;
    }
    
    /**
     * @brief 设置是否自动重连
     * 
     * @param enable 是否启用自动重连
     */
    virtual void setAutoReconnect(bool enable) {
        // 默认实现什么都不做
    }

protected:
    DataCallback m_dataCallback;
};

// 创建市场数据接口的工厂函数类型
using MarketDataInterfaceFactory = std::function<std::unique_ptr<MarketDataInterface>()>;

} // namespace hft